home *** CD-ROM | disk | FTP | other *** search
- /*****
- *
- * MiscUtil.c
- *
- * This is a support file for "Grant's CGI Framework".
- * Please see the license agreement that accompanies the distribution package
- * for licensing details.
- *
- * Copyright ©1995,1996 by Grant Neufeld
- * grant@acm.com
- * http://arpp.carleton.ca/cgi/framework/
- *
- *****/
-
- #include "MiscUtil.h"
-
- /* */
- UInt32
- UtilRandomFromLong ( UInt32 maxNum )
- {
- UInt32 randomNumber;
- Boolean gotNumber;
- short escapeCount;
-
- gotNumber = false;
- escapeCount = 8; /* max number of times through the loop */
-
- if ( maxNum == 0 )
- {
- randomNumber = 0;
- gotNumber = true;
- }
- if ( maxNum < 65536 )
- {
- do
- {
- escapeCount--;
- /* maxNum is short, so just get a short value */
- randomNumber = UtilRandomShort ();
- if ( randomNumber > maxNum )
- {
- if ( maxNum <= 4096 )
- {
- /* get the mod of the randomNumber if the maxNum is small enough
- to not be too biased when using it to mod */
- randomNumber %= maxNum;
- gotNumber = true;
- }
- else
- {
- /* need to try again */
- }
- }
- else
- {
- gotNumber = true;
- }
- } while ( !gotNumber && (escapeCount > nil) );
- }
- else
- {
- do
- {
- escapeCount--;
- /* maxNum is short, so just get a short value */
- randomNumber = UtilRandomLong ();
- if ( randomNumber > maxNum )
- {
- if ( maxNum <= 1677216 )
- {
- /* get the mod of the randomNumber if the maxNum is small enough
- to not be too biased when using it to mod */
- randomNumber %= maxNum;
- gotNumber = true;
- }
- else
- {
- /* need to try again */
- }
- }
- else
- {
- gotNumber = true;
- }
- } while ( !gotNumber && (escapeCount > nil) );
- }
-
- if ( !gotNumber )
- {
- /* too many loops, but still didn't get the number, just div 2 until one is found */
- do
- {
- randomNumber /= 2;
- if ( randomNumber <= maxNum )
- {
- gotNumber = true;
- }
- } while ( !gotNumber );
- }
-
- return randomNumber;
- } /* UtilRandomFromLong */
-
-
- /* returns a random unsigned number (32 bits long) */
- UInt32
- UtilRandomLong ( void )
- {
- UInt32 randomNumber;
-
- *((UInt16 *)(&randomNumber)) = Random ();
- *((UInt16 *)(&randomNumber) + 2) = Random ();
-
- return randomNumber;
- } /* UtilRandomLong */
-
-
- /* returns a random unsigned number (16 bits short) */
- #if 0 /* moved to macro in header */
- UInt16
- UtilRandomShort ( void )
- {
- UInt16 randomNumber;
-
- randomNumber = Random ();
-
- return randomNumber;
- } /* UtilRandomShort */
- #endif /* 0 */
-
-